<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>设计模式</title>
</head>
<body>

</body>
</html>

<script type="text/javascript">
// JS设计模式
/**
 * 什么是设计模式？
 * 设计模式是一套反复使用、思想成熟、经过分类和无数实践设计经验的总结；是为了代码的可重用、可扩展、可解耦、更容易被人理解和保证代码的可靠性。
 * 学习设计模式，有助于写出可复用和可维护高的程序，不过要注意，使用不当的话，可能会事半功倍。
 *
 * 设计原则：
 * 1. 单一职责原则（SRP）
 * 一个对象或者方法只做一件事情。如果一个方法承担了过多的事情，那么在需求变动的时候，需要改写这个方法的可能性就会越来越大。（应该把对象或者方法划分为较小的粒度）
 *
 * 2.最少知识原则（LKP）
 * 尽量减少对象之间的交互。如果两个对象没必要进行彼此进行通信，尽量写一个第三方处理。
 *
 * 3.开放-封闭原则（OCP）
 * 软件实体（类、模块、函数）等应该是可扩展的，但是不可修改
 * 当需要修改一个系统的功能或者增加新功能的时候，应该采用增加代码的方式，尽量避免修改系统的源代码，以免影响系统的稳定。
 *
 *
 * 设计模式分类：
 * 原型模式：原型实例指向创建对象的种类，并拷贝原型来创建新的对象。也就是说创建一个对象作为新对象的原型prototype属性。
 * （创建一个共享的原型，通过拷贝这个原型创建新的类，用于创建重复的类，来提升性能）
 *
 * 单例模式：保证一个类只有一个实例，并且有一个全局的访问点。
 * （先判断全局是否存在这个实例，存在直接返回，不存在先创建再返回，确保一个类只有一个实例对象）
 *
 * 策略模式：定义一系列算法，把它们一个个封装起来。将算法的使用与实现分开
 * （经典的表单的验证：定义规则集==》定义提示集==》定义验证方法）
 * 优点： 可以有效避免多重条件语句，看起来直观，便于维护
 * 缺点： 策略集往往较多，要提前考虑周全所有情况
 *
 * 模块模式：模块模式就是单例模式创建私有属性和方法，减少全局变量的使用。（闭包）
 * （创建初始化一个对象的时候，并且要访问私有属性的方法的时候用到模块模式）
 *
 * 命令模式：命令指的是可以执行某一特定事件的指令，用一种松耦合的方式设计程序，使得请求发送者和请求接收者能够消除彼此之间的耦合关系。（不懂）
 * 宏命令：将一些方法放到数组中去，循环执行数组中的方法（类似Vue响应原理中的中订阅者触发watcher）
 *
 * 代理模式：当用户访问一个对象的时候，不方便直接访问或者代价太大，就需要一个提供一个代理对象来代替接收访问，之后再转交给本体对象。
 * 1. 保护代理：用于控制不同权限的的对象对目标对象访问，实现访问对象的权限控制
 * 2. 虚拟代理：通常用在本体对象的控制和创建有很大的代价的时候，许你对象会把实例化推迟到有方法调用的时候。
 * 3. 缓存代理：为一些开销大的运算作缓存，如果下次传进来的参数跟上次一样直接返回缓存。
 *
 * 外观模式：将定义的一组接口放在一个接口里面，使子接口更加方便调用。
 *
 * 观察者模式：（发布-订阅模式）一个发布，多个订阅，当一个对象发生改变的时候，所有跟他有关系的对象都会收到通知。
 * 优点：支持简单的广播通信，当对象状态改变时，会自动通知已经订阅过得对象。降低了发布订阅的耦合性。
 * 缺点：创建订阅者要耗内存；同时用的多的话不好理解
 *
 * 装饰器模式：不改变对象自身的基础上，动态添加额外的功能，不影响原来的功能。
 *
 * 模板方法模式：（继承时间）两部分：抽象父类和具体实现的子类
 */

</script>